<?php
/**
 * Mapper des utilisateurs
 * @package bp-clients
 */

/**
 * Mapper des utilisateurs
 * @package bp-clients
 */ 
class Application_Model_MapperUtilisateur extends Application_Model_MapperAbstract
										   implements Application_Model_MapperInterface
{
	/**
     * Nom de la classe DbTable liée
     * @var string
     */
	static protected $_nomClasseDb = 'Application_Model_DbTable_Utilisateurs';
    
    /**
     * Nom de la classe Model liée
     * @var string
     */
	static protected $_nomClasseModel = 'Application_Model_Utilisateur';

	/**
     * Renvoie le nom de la classe DbTable liée
     * @return string
     */
	public function getNomClasseTable(){
		return 'Application_Model_DbTable_Utilisateurs';
	}
	
	/**
     * Renvoie le nom de la classe Model liée
     * @return string
     */
	public function getNomClasseModel(){
		return 'Application_Model_Utilisateur';
	}

    /**
     * Supprime un enregistrement dans la db
     * @param int $id identifiant de l'enregistrement
     */
    public function delete($id)
    {
        $where = $this->_dbTable->getAdapter()->quoteInto(Application_Model_DbTable_Utilisateurs::COL_ID . ' = ?', $id);
        return $this->_dbTable->delete($where);
    }

    /**
     * Renvoie un tableau de tout les utilisateurs actifs
     * @param string $triCol le nom de la colonne de tri
     * @param string $triDir 'ASC' ou 'DESC', le sens de tri
     * @return array le tableau de tout les models
     */
    public function fetchActifs($triCol='', $triDir='ASC')
    {
        $select = $this->selectOrder($triCol, $triDir);
        $select = $select->where(Application_Model_DbTable_Utilisateurs::COL_ACTIF . " = ?", 
                               Application_Model_DbTable_Utilisateurs::ENUM_ACTIF_ACTIF);
        $rows = $this->_dbTable->fetchAll($select);
        return $this->mapToModelArray($rows);
    }
   
    /**
     * Renvoie un paginator
     * @param string $triCol le nom de la colonne de tri
     * @param string $triDir 'ASC' ou 'DESC', le sens de tri
     * @param boolean $afficherInactif flag: afficher ou non les utilisateurs inactifs
     * @return Zend_Paginator
     */
    public function getPaginator($triCol, $triDir, $afficherInactif)  
    {  
        if ($afficherInactif) {
            $data = $this->fetchAll($triCol, $triDir);
        }
        else {
			$data = $this->fetchActifs($triCol, $triDir);
		}
        $paginator = Zend_Paginator::factory($data);  
        return $paginator;  
    }
    
    /**
     * Authentifie l'utilisateur
     * @todo la connexion se fait par nom (->email) et le mdp n'est pas case-sensitive
     */
    public function authenticate(Application_Model_Utilisateur $utilisateur){
        $table = $this->_dbTable;
        $select  = $table->select();
        $select->where('UPPER(' . $table::COL_NOM . ') = ?', strtoupper($utilisateur->getNom()))
               ->where($table::COL_MOT_DE_PASSE . ' = SHA1(?)', strtoupper($utilisateur->getMotDePasse()));
        $rowUtilisateur = $table->fetchRow($select);
        if (null === $rowUtilisateur) {
            // failed
            $result = new Zend_Auth_Result(
                Zend_Auth_Result::FAILURE_UNCATEGORIZED,
                null
            );
        } else {
            // passed
            $this->mapToModelObject($rowUtilisateur, $utilisateur);
            $result = new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $utilisateur);
        }
        return $result;      
    }

}
